package com.tjy.quartz.websocket;


import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * 扩展WebSocket服务：支持按用户角色推送（管理员/蜂农）
 * 连接地址格式：ws://localhost:8080/ws/demo/{userId}/{role}
 * 其中role=admin（管理员）或farmer（蜂农）
 */
@ServerEndpoint("/ws/demo/{userId}/{role}")
@Component
public class MyWebSocketServer {

    // 1. 存储所有在线连接（线程安全）
    private static final CopyOnWriteArraySet<MyWebSocketServer> WEB_SOCKET_SET = new CopyOnWriteArraySet<>();

    // 2. 存储用户ID与连接的映射（用于定向推送）
    private static final Map<String, MyWebSocketServer> USER_MAP = new ConcurrentHashMap<>();

    // 3. 当前连接的信息
    private Session session;      // 会话
    private String userId;        // 用户ID
    private String role;          // 角色（admin/farmer）


    /**
     * 连接建立时触发
     */
    @OnOpen
    public void onOpen(Session session,
                       @PathParam("userId") String userId,
                       @PathParam("role") String role) {
        this.session = session;
        this.userId = userId;
        this.role = role;

        WEB_SOCKET_SET.add(this);
        USER_MAP.put(userId, this);

        sendMessage(userId + "✅ 连接成功！你的角色：" + role);

    }


    /**
     * 发送消息给当前连接
     */
    public void sendMessage(String message) {
        // 检查session是否存在且未关闭
        if (this.session == null || !this.session.isOpen()) {
            System.out.println("连接已关闭或未初始化，无法发送消息：" + message);
            return;
        }

        try {
            this.session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            System.out.println("发送消息失败！" + e.getMessage());
        }
    }


    // ------------------------------ 核心：定向推送方法 ------------------------------

    /**
     * 向指定用户推送消息（如只给管理员推报警）
     * @param userId 目标用户ID
     * @param message 消息内容
     */
    public static void sendToUser(String userId, String message) {
        if (USER_MAP.containsKey(userId)) {
            USER_MAP.get(userId).sendMessage(message);
        } else {
            System.out.println("用户在线：" + userId);
        }
    }

    /**
     * 向所有管理员推送消息（如系统报警）
     * @param message 消息内容
     */
    public static void sendToAllAdmin(String message) {
        for (MyWebSocketServer ws : WEB_SOCKET_SET) {
            if ("admin".equals(ws.role)||"farmer".equals(ws.role)) {
                ws.sendMessage(message);
            }
        }
    }

    /**
     * 向指定蜂农推送消息（如提醒他越界）
     * @param farmerId 蜂农ID
     * @param message 消息内容
     */
    public static void sendToFarmer(String farmerId, String message) {
        for (MyWebSocketServer ws : WEB_SOCKET_SET) {
            if ("farmer".equals(ws.role) && farmerId.equals(ws.userId)) {
                ws.sendMessage(message);
                break;
            }
        }
    }


    // 以下方法与之前相同，省略（onClose/onMessage/onError）
    @OnClose
    public void onClose() {
        WEB_SOCKET_SET.remove(this);
        USER_MAP.remove(this.userId);
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 可根据需要处理前端消息（如蜂农手动上报位置）
    }

    @OnError
    public void onError(Session session, Throwable error) {
    }
}